package ui;

import java.awt.Rectangle;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import servicios.GenericBusinessException;
import util.GuiUtilities;
import dominio.Pedido;

public class UIPlanProduccion extends JFrame implements Observer{

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JScrollPane jScrollPane = null;
	private JTable jTable = null;
	private JButton btnFinalizar = null;
	private DefaultTableModel tabModel = new DefaultTableModel();
	private ModeloPlanProduccion modeloPlanProduccion;
	private JLabel lblFechaHora = null;
	private JTextField txtFechaHora = null;
	private JLabel lblHora = null;
	private JTextField txtHora = null;
	private int rowFinalizable=-1;
	public DefaultTableModel getTabModel() {
		return tabModel;
	}

	public void setTabModel(DefaultTableModel tabModel) {
		this.tabModel = tabModel;
	}

	/**
	 * This is the default constructor
	 */
	public UIPlanProduccion(ModeloPlanProduccion modeloPlanProduccion) {
		super();
		this.modeloPlanProduccion=modeloPlanProduccion;
		modeloPlanProduccion.agregarObservador(this);
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(735, 341);
		this.setContentPane(getJContentPane());
		this.setTitle("Plan de Produccion");
		actualizarLista();
	}

	private void actualizarLista() {
		getJTable().removeAll();
		List<Object> resultado = new ArrayList<Object>();
		try {
			resultado=Fachada.getPlanProduccion();
			rowFinalizable=Fachada.getPedidoFinalizable(resultado);
			if(!resultado.isEmpty()){
				Vector<String> columns=new Vector<String>();
				String[] columnnames={ 
						"Id","Cliente","Pri Cliente","Estado","Fecha Entrega","Fecha Finalizado","Ganancia","Tiempo Produccion(Dias)"
				};
				for(int i=0;i<columnnames.length;i++)
					columns.addElement((String) columnnames[i]);
				getTabModel().setRowCount(resultado.size());
				Vector<Object> lasRows=new Vector<Object>();
				for(int x=0;x<resultado.size();x++){
					Vector<Object> unaRow=new Vector<Object>();
					Pedido unPedido=(Pedido)resultado.get(x);
					unaRow.add(unPedido.getId());
					unaRow.add(unPedido.getCliente().getNombre());	
					unaRow.add(unPedido.getCliente().getPrioridad());	
					unaRow.add(unPedido.getEstado());
					SimpleDateFormat sdf=new java.text.SimpleDateFormat("dd/MM/yyyy");
					String fechaE = sdf.format(unPedido.getFechaEntrega());
					unaRow.add(fechaE);	
					if(unPedido.getFechaFinalizado()!=null){
						SimpleDateFormat sdf2=new java.text.SimpleDateFormat("dd/MM/yyyy - HH:mm");
						String fecha2 = sdf2.format(unPedido.getFechaFinalizado());
						unaRow.add(fecha2);	
					}else{
						unaRow.add("");}
					unaRow.add(Fachada.calcularGanancia(unPedido));
					unaRow.add(Fachada.calcularTiempoProduccion(unPedido));
					lasRows.add(unaRow);

				}
				getTabModel().setDataVector(lasRows, columns);
				marcarFinalizados();
				mostrarFechaHora();
			}
		} catch (Exception e) {
			GuiUtilities.showError(this,e.getMessage());
		}
	}

	@SuppressWarnings("static-access")
	private void mostrarFechaHora() {
		GregorianCalendar cal=new GregorianCalendar();
		cal.setTime(new Date());
		txtFechaHora.setText(Integer.toString(cal.get(cal.DAY_OF_MONTH))+
		"/"+Integer.toString(cal.get(cal.MONTH))+"/"+Integer.toString(cal.get(cal.YEAR)));
		txtHora.setText(Integer.toString(cal.get(cal.HOUR_OF_DAY))+
				":"+Integer.toString(cal.get(cal.MINUTE))+":"+
				Integer.toString(cal.get(cal.SECOND)));
	}

	private void marcarFinalizados() {
		for(int i=0;i<getTabModel().getRowCount();i++){
			String estado=getJTable().getValueAt(i, 3).toString();
			if(estado.equals("Finalizado")){


				
			}
		}
	}
	
	

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			lblHora = new JLabel();
			lblHora.setBounds(new Rectangle(229, 273, 46, 26));
			lblHora.setText("Hora");
			lblFechaHora = new JLabel();
			lblFechaHora.setBounds(new Rectangle(10, 273, 122, 27));
			lblFechaHora.setText("Fecha (DD/MM/AAAA)");
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJScrollPane(), null);
			jContentPane.add(getBtnFinalizar(), null);
			jContentPane.add(lblFechaHora, null);
			jContentPane.add(getTxtFechaHora(), null);
			jContentPane.add(lblHora, null);
			jContentPane.add(getTxtHora(), null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setBounds(new Rectangle(2, 27, 720, 241));
			jScrollPane.setViewportView(getJTable());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jTable	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTable() {
		if (jTable == null) {
			jTable = new JTable(getTabModel()){
				
			/**
				 * 
				 */
				private static final long serialVersionUID = 1L;

			public boolean isCellEditable(int row, int column)
			{
			return false;
			}};
			jTable.setDefaultRenderer (Object.class, new TableRender());
		}
		return jTable;
	}

	/**
	 * This method initializes btnFinalizar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getBtnFinalizar() {
		if (btnFinalizar == null) {
			btnFinalizar = new JButton();
			btnFinalizar.setBounds(new Rectangle(415, 274, 131, 25));
			btnFinalizar.setText("Finalizar Pedido");
			btnFinalizar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					finalizarPedido();
					modeloPlanProduccion.hasChanged();
				}
			});
		}
		return btnFinalizar;
	}

	protected void finalizarPedido() {
		if(getJTable().getSelectedRow()!=rowFinalizable||getJTable().getSelectedRow()==-1){
			GuiUtilities.showError(this,"Solo puede finalizar el primer pedido no finalizado de la lista");
		}else{
			int idPedido=Integer.parseInt(getJTable().getValueAt(getJTable().getSelectedRow(), 0).toString());
			try {
				Pedido pedido=Fachada.buscarPedido(idPedido);
				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
				String date=txtFechaHora.getText().toString()+" "+
				txtHora.getText().toString();
				java.util.Date utilDate = sdf.parse(date);
				pedido.setFechaFinalizado(utilDate);
				Fachada.finalizarPedido(pedido);
			} catch (GenericBusinessException e) {
				GuiUtilities.showError(this,e.getMessage());
			} catch (ParseException e) {
				GuiUtilities.showError(this,"El formato debe ser dd/mm/aaaa y hh:mm:ss");
			}
		}
	}

	@Override
	public void update(Observable arg0, Object arg1) {
		actualizarLista();
		
	}

	/**
	 * This method initializes txtFechaHora	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtFechaHora() {
		if (txtFechaHora == null) {
			txtFechaHora = new JTextField();
			txtFechaHora.setBounds(new Rectangle(136, 273, 86, 27));
		}
		return txtFechaHora;
	}

	/**
	 * This method initializes txtHora	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getTxtHora() {
		if (txtHora == null) {
			txtHora = new JTextField();
			txtHora.setBounds(new Rectangle(284, 272, 105, 26));
		}
		return txtHora;
	}

}  //  @jve:decl-index=0:visual-constraint="4,9"
